home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldico02 / ldico02s.lzh / LDICO.S < prev    next >
Text File  |  1997-04-05  |  26KB  |  1,125 lines

  1. *********************************************************************************
  2. *    ICO Loader                    <LDICO.X Ver. 0.02>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9. i_tate:        equ    $16
  10. i_yoko:        equ    $1a
  11. i_pal:        equ    $3e
  12. i_data:        equ    $7e
  13.  
  14.     .text
  15. start:
  16.     lea.l    mysp(pc),sp        *スタックセット
  17.  
  18.     bsr    cmdchk            *コマンドラインの解析
  19.     bsr    super            *スーパーモードへ
  20.     bsr    cursol_clr        *カーソル消す
  21.     bsr    name_get        *ファイル名を取得し処理する
  22.     bsr    cursol_recv        *カーソル戻す
  23.     bsr    user            *ユーザモードへ
  24.     bsr    exit            *終了処理
  25.     DOS    _EXIT
  26.  
  27. *****************************************************************
  28. *    ファイル名を取得し、ファイルの読み込みを行う        *
  29. *****************************************************************
  30. name_get:
  31.     clr.w    file_cnt        *ファイル数のカウント初期化
  32.  
  33.     bsr    chkname            *ファイル名に対する前処理
  34.     bsr    chkext            *拡張子が省略されているかチェック
  35.  
  36.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  37.     pea.l    arg(pc)            *
  38.     pea.l    filbuf(pc)        *
  39.     DOS    _FILES            *
  40.     lea.l    10(sp),sp        *
  41.  
  42. loop:
  43.     tst.l    d0            *ファイルは見つかったか?
  44.     bmi    done            * 見つからなければ処理完了
  45.  
  46.     bsr    setpath            *得られたファイル名を
  47.                     * フルパスに再構成する
  48.  
  49.     bsr    main            *メイン処理
  50.  
  51.     tst.b    esc_flg            *エスケープ?
  52.     bne    done
  53.  
  54.     pea.l    filbuf(pc)        *つぎのファイルを検索する
  55.     DOS    _NFILES            *
  56.     addq.l    #4,sp            *
  57.  
  58.     bra    loop            *繰り返す
  59.  
  60. done:
  61.     bsr    file_cnt_chk        *処理したファイル数のチェック
  62.     rts
  63.  
  64. *****************************************************************
  65. *    files実行に先立ってファイル名に前処理を加える        *
  66. *****************************************************************
  67. chkname:
  68.     pea.l    nambuf(pc)        *ファイル名を展開する
  69.     pea.l    arg(pc)            *
  70.     DOS    _NAMECK            *
  71.     addq.l    #8,sp            *
  72.  
  73.     tst.l    d0            *d0<0なら
  74.     bmi    name_er            * ファイル名の指定に誤りがある
  75.  
  76.     beq    nowild            *d0=0ならワイルドカード指定なし
  77.  
  78.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  79.     bne    wild            * ワイルドカード指定あり
  80.  
  81. noname:                    *ファイル名が指定されていない場合
  82.     lea.l    arg(pc),a0        *バッファargに
  83.     lea.l    nambuf(pc),a1        * nameckで展開したパス名+'*.ICO'
  84.     bsr    strcpy            * を再構成する
  85.     lea.l    kome0(pc),a1        *
  86.     bsr    strcpy            *
  87.  
  88. wild:                    *ワイルドカードが指定された場合
  89.                     *何もしなくてよい
  90. cknam0:
  91.     rts
  92.  
  93. nowild:                    *ワイルドカードが指定されていない場合
  94.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  95.     pea.l    arg(pc)            * 検索してみる
  96.     pea.l    filbuf(pc)        *
  97.     DOS    _FILES            *
  98.     lea.l    10(sp),sp        *
  99.  
  100.     tst.l    d0            *見つかったか?
  101.     bmi    cknam0            * 見つからなければファイルだろう
  102.  
  103.     lea.l    arg(pc),a0        *バッファargに
  104.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.ICO'
  105.     bsr    strcat            * を再構成する
  106.  
  107.     bra    chkname            *nameckでファイル名を展開するために
  108.                     * サブルーチン先頭に戻る
  109.  
  110. *****************************************************************
  111. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  112. *        arg以降に格納する                *
  113. *****************************************************************
  114. setpath:
  115.     lea.l    arg(pc),a0        *a0=コピー先
  116.     lea.l    nambuf(pc),a1        *a1=nameckで展開したパス名
  117.     bsr    strcpy            *コピーする
  118.     lea.l    filbuf(pc),a1        *a1=files,nfilesで見付けたファイル名
  119.     lea.l    30(a1),a1
  120.     bsr    strcpy            *連結する
  121.     rts
  122.  
  123. *****************************************************************
  124. *    文字列の連結および複写                    *
  125. *    リターン時a0は文字列末の00Hを指す            *
  126. *****************************************************************
  127. strcat:
  128.     tst.b    (a0)+            *(a0)は0か?
  129.     bne    strcat            *そうでなければ繰り返す
  130.     subq.l    #1,a0            *行きすぎたから1つ戻る
  131. strcpy:
  132.     move.b    (a1)+,(a0)+        *1文字ずつ
  133.     bne    strcpy            *終了コードまでを転送する
  134.     subq.l    #1,a0            *a0は進み過ぎている
  135.                     *a0は文字列末の00Hを指す
  136.     rts
  137.  
  138. *****************************************************************
  139. *    拡張子を補う                        *
  140. *****************************************************************
  141. chkext:
  142.     lea.l    arg(pc),a0        *ファイル名のアドレス
  143.     lea.l    dext(pc),a1        *拡張子のアドレス
  144. chkext0:
  145.     cmp.b    #'.',(a0)        *拡張子があるか
  146.     beq    chkext2
  147.     tst.b    (a0)+            *(a0)は0か?
  148.     bne    chkext0            *そうでなければ繰り返す
  149.     subq.l    #1,a0            *行きすぎたから1つ戻る
  150. chkext1:
  151.     move.b    (a1)+,(a0)+        *1文字転送
  152.     bne    chkext1            *終了コードまで繰り返す
  153. chkext2:
  154.     rts
  155.  
  156. *****************************************************************
  157. *    コマンドラインのチェックを行う                *
  158. *****************************************************************
  159. cmdchk:
  160.     lea.l    arg(pc),a0        *a0=引数切り出し領域
  161.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  162.     clr.w    crt_mode        *画面モードの初期値
  163.  
  164. cmdchk0:
  165.     bsr    switch_chk        *スイッチのチェック
  166.  
  167.     tst.b    (a2)            *引数があるか?
  168.     beq    usage            *ないならファイル名が足りない
  169.     bsr    getarg            *ファイル名切り出し
  170.     bsr    switch_chk        *さらにスイッチのチェック
  171.     tst.b    (a2)            *引数があるか?
  172.     bne    usage            * あるなら引数が多い
  173. cmdchk1:
  174.     rts
  175.  
  176. *****************************************************************
  177. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  178. *    スイッチがあれば処理してしまう                *
  179. *****************************************************************
  180. switch_chk:
  181.     bsr    skipsp            *スペースをスキップする
  182.     tst.b    (a2)            *まだスイッチがあるか?
  183.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  184.  
  185.     cmpi.b    #'/',(a2)        *引数の先頭が
  186.     beq    switch_chk1        */,-であれば
  187.     cmpi.b    #'-',(a2)        *  スイッチ
  188.     beq    switch_chk1        *
  189.     bra    switch_chk2        *スイッチでないなら戻る
  190.  
  191. switch_chk1:
  192.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  193.     tst.b    (a2)            *スイッチがあるか?
  194.     beq    usage            * ないなら使用方表示
  195.     move.b    (a2)+,d0        *1文字取り出す
  196.     bsr    toupper            *大文字に変換しておく
  197.  
  198.     cmpi.b    #'K',d0            *Kスイッチ?
  199.     beq    ksw            * そうなら分岐
  200.     cmpi.b    #'C',d0
  201.     beq    csw
  202.     cmpi.b    #'S',d0
  203.     beq    ssw
  204.     cmpi.b    #'L',d0
  205.     beq    lsw
  206.     cmpi.b    #'H',d0
  207.     beq    hsw
  208.     bra    usage            *無効なスイッチが指定された
  209.  
  210. ksw:
  211.     tst.b    kflg            *スイッチの二重指定チェック
  212.     bne    usage
  213.     st    kflg            *KスイッチON
  214.     bra    switch_chk        *まだスイッチがあるかもしれない
  215.  
  216. csw:
  217.     tst.b    cflg
  218.     bne    usage
  219.     st    cflg
  220.     bra    switch_chk
  221.  
  222. ssw:
  223.     bsr    ssw_ana
  224.     bra    switch_chk
  225.  
  226. lsw:
  227.     bsr    lsw_ana
  228.     bra    switch_chk
  229.  
  230. hsw:
  231.     tst.b    hflg
  232.     bne    usage
  233.     st    hflg
  234.     bra    switch_chk
  235.  
  236. switch_chk2:
  237.     rts
  238.  
  239. *****************************************************************
  240. *    Sスイッチの解析                    *
  241. *****************************************************************
  242. ssw_ana:
  243.     tst.b    sflg            *Sスイッチの2重指定
  244.     bne    usage
  245.     st    sflg
  246.  
  247.     move.b    (a2),d0            *1文字取り出す
  248.     cmp.b    #' ',d0            *Sだけかな
  249.     beq    ssw_ana9        *画面モードの指定なし
  250. ssw_ana1:
  251.     bsr    num_read        *
  252.     cmp.w    crt_max(pc),d0        *
  253.     bhi    usage
  254.     move.w    d0,crt_mode
  255.     subq.l    #1,a2            *1文字戻す
  256. ssw_ana9:
  257.     rts
  258.  
  259. *****************************************************************
  260. *    Lスイッチの解析                    *
  261. *****************************************************************
  262. lsw_ana:
  263.     move.b    (a2),d0            *1文字取り出す
  264.     bsr    toupper            *大文字に変換しておく
  265.     cmp.b    #'C',d0            *LCかな
  266.     bne    usage
  267.     tst.b    lcflg            *LCスイッチの2重指定
  268.     bne    usage
  269.     st    lcflg            *LCスイッチオン
  270.     addq.l    #1,a2            *1文字進める
  271.     rts
  272.  
  273. *****************************************************************
  274. *    ファイル名を切り出す                    *
  275. *****************************************************************
  276. getarg:
  277.     move.l    a0,-(sp)        *{レジスタ待避
  278. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  279.     beq    gtarg1            *
  280.     cmpi.b    #SPACE,(a2)        *2)スペースか
  281.     beq    gtarg1            *
  282.     cmpi.b    #TAB,(a2)        *3)タブか
  283.     beq    gtarg1            *
  284. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  285. *    beq    gtarg1            *
  286.     cmpi.b    #'/',(a2)        *5)スラッシュ
  287.     beq    gtarg1            *
  288.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  289.     bra    gtarg0            * 繰り返す
  290. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  291.     movea.l    (sp)+,a0        *}レジスタ復帰
  292.     rts
  293.  
  294. *****************************************************************
  295. *    スペース・TABをスキップする                *
  296. *****************************************************************
  297. skipsp0:
  298.     addq.l    #1,a2
  299. skipsp:
  300.     cmpi.b    #$20,(a2)
  301.     beq    skipsp0
  302.     cmpi.b    #$09,(a2)
  303.     beq    skipsp0
  304.     rts
  305.  
  306. *****************************************************************
  307. *    小文字→大文字変換ルーチン                *
  308. *****************************************************************
  309. toupper:
  310.     cmpi.b    #'a',d0
  311.     bcs    toupr0
  312.     cmpi.b    #'z'+1,d0
  313.     bcc    toupr0
  314.     subi.b    #$20,d0
  315. toupr0:
  316.     rts
  317.  
  318. *****************************************************************
  319. *    数字の解析    d0に数字を返す                *
  320. *****************************************************************
  321. num_read:
  322.     clr.w    d0
  323. num_read0:
  324.     clr.w    d1
  325.     move.b    (a2)+,d1
  326.     sub.b    #'0',d1
  327.     cmp.b    #10,d1
  328.     bcc.b    num_read1
  329.     mulu    #10,d0
  330.     add.w    d1,d0
  331.     bra.b    num_read0
  332. num_read1:
  333.     rts
  334.  
  335. *****************************************************************
  336. *    メイン処理                        *
  337. *****************************************************************
  338. main:
  339.     tst.b    int_flg            *画面の初期化は一回だけ
  340.     bne    main0
  341.     bsr    scr_int            *画面の初期化
  342.  
  343. main0:
  344.     lea.l    arg(pc),a0        *ファイル名セット
  345.     bsr    file_open        *ファイルオープン
  346.     bsr    file_size        *ファイルサイズを調べる
  347.  
  348.     cmp.l    #766,d6            *対応しているサイズか
  349.     beq    main1
  350.     bsr    ico_err
  351.     bra    main9
  352.  
  353. main1:
  354.     lea.l    icon_buff(pc),a4    *バッファに読み込む
  355.     bsr    file_read        *ファイル読む
  356.     bsr    file_close        *ファイルクローズ
  357.  
  358.     bsr    pal_conv        *パレットデータのコンバート
  359.     bsr    lc_chk            *ロード座標のチェック
  360.     bsr    icon_prt        *アイコンの表示
  361.     bsr    key_wait        *キー入力待ち
  362.     add.w    #1,file_cnt        *ファイル数のカウント+1
  363.  
  364. main9:
  365.     rts
  366.  
  367. *****************************************************************
  368. *    画面の初期化を行う                    *
  369. *****************************************************************
  370. scr_int:
  371.     st    int_flg            *画面の初期化は一回だけ
  372.  
  373.     bsr    v_wait
  374. *    move.w    #$100+$c,d1        *画面初期化
  375. *    IOCS    _CRTMOD
  376.     move.w    #$1a,d1            *テキスト消去&HOMEポジションへ
  377.     IOCS    _B_PUTC
  378.     IOCS    _MS_CUROF        *マウスカーソル消す
  379.     moveq.l    #0,d1            *ソフトキーボード消す
  380.     moveq.l    #0,d2
  381.     IOCS    _SKEY_MOD
  382.     lea.l    func_off_mes(pc),a0    *ファンクションキー消す
  383.     bsr    mesput
  384.  
  385.     move.w    #$20,$e82600        *グラフィック画面オフ
  386.     move.w    #%00000000_00000011,$e82400    *色モード・実画面サイズ設定
  387.     move.w    #%00_00_01_10_11100100,$e82500    *Sp>Text>Graphicプライオリティ設定
  388.  
  389.     bsr    crtc_set
  390.     bsr    gpal_set
  391.     bsr    gr_int
  392.  
  393.     move.w    #$2f,$e82600        *グラフィック画面オン
  394.     rts
  395.  
  396. *****************************************************************
  397. *    グラフィック画面消去のチェック                *
  398. *****************************************************************
  399. gr_int:
  400.     tst.b    cflg            *画面消去あり?
  401.     beq    gr_int9            *指定無し
  402.  
  403.     movem.l    d0-d7/a0-a6,-(sp)
  404.  
  405.     moveq.l    #0,d0            *レジスタクリア
  406.     moveq.l    #0,d1
  407.     moveq.l    #0,d2
  408.     moveq.l    #0,d3
  409.     moveq.l    #0,d4
  410.     moveq.l    #0,d5
  411.     moveq.l    #0,d6
  412.     moveq.l    #0,d7
  413.     movea.l    d0,a1
  414.     movea.l    d0,a2
  415.     movea.l    d0,a3
  416.     movea.l    d0,a4
  417.     movea.l    d0,a5
  418.     movea.l    d0,a6
  419.  
  420.     movea.l    #GRAM_MAX,a0
  421.     move.w    #512,line_cnt
  422.  
  423. gr_int1:
  424.     movem.l    d0-d7/a1-a6,-(a0)    *14*4=56
  425.     movem.l    d0-d7/a1-a6,-(a0)
  426.     movem.l    d0-d7/a1-a6,-(a0)
  427.     movem.l    d0-d7/a1-a6,-(a0)
  428.     movem.l    d0-d7/a1-a6,-(a0)
  429.     movem.l    d0-d7/a1-a6,-(a0)
  430.     movem.l    d0-d7/a1-a6,-(a0)
  431.     movem.l    d0-d7/a1-a6,-(a0)
  432.     movem.l    d0-d7/a1-a6,-(a0)
  433.     movem.l    d0-d7/a1-a6,-(a0)
  434.     movem.l    d0-d7/a1-a6,-(a0)
  435.     movem.l    d0-d7/a1-a6,-(a0)
  436.     movem.l    d0-d7/a1-a6,-(a0)
  437.     movem.l    d0-d7/a1-a6,-(a0)
  438.     movem.l    d0-d7/a1-a6,-(a0)
  439.     movem.l    d0-d7/a1-a6,-(a0)
  440.     movem.l    d0-d7/a1-a6,-(a0)
  441.     movem.l    d0-d7/a1-a6,-(a0)
  442.     movem.l    d0-d3,-(a0)
  443.  
  444.     subq.w    #1,line_cnt
  445.     bne    gr_int1
  446.  
  447.     movem.l    (sp)+,d0-d7/a0-a6
  448.  
  449. gr_int9:
  450.     rts
  451.  
  452. *****************************************************************
  453. *    グラフィックパレットセット(65536色標準パレット)        *
  454. *****************************************************************
  455. gpal_set:
  456.     moveq.l    #$0001,d0
  457.     move.l    #$0202,d1
  458.     movea.l    #GPAL,a0
  459.  
  460.     moveq.l    #512/4-1,d6
  461. gpal_set_:
  462.     move.w    d0,(a0)+
  463.     move.w    d0,(a0)+
  464.     add.l    d1,d0
  465.     dbra    d6,gpal_set_
  466.     rts
  467.  
  468. *****************************************************************
  469. *    パレット変換                        *
  470. *****************************************************************
  471. pal_conv:
  472.     lea.l    icon_buff(pc),a0    *変換元
  473.     lea.l    i_pal(a0),a0
  474.     movea.l    a0,a1            *変換先
  475.  
  476.     moveq.l    #16-1,d0        *パレット数
  477.     move.w    #$00f8,d7        *マスクデータ
  478. pal_conv1:
  479.     move.b    (a0)+,d1        *B
  480.     move.b    (a0)+,d2        *G
  481.     move.b    (a0)+,d3        *R
  482.     addq.w    #1,a0
  483.     and.w    d7,d1
  484.     and.w    d7,d2
  485.     and.w    d7,d3
  486.     lsr.w    #2,d1
  487.     lsl.w    #3,d3
  488.     lsl.w    #8,d2
  489.     or.w    d2,d1
  490.     or.w    d3,d1
  491.     move.w    d1,(a1)+
  492.     dbra    d0,pal_conv1
  493.     rts
  494.  
  495. *****************************************************************
  496. *    ロード座標のチェック                    *
  497. *****************************************************************
  498. lc_chk:
  499.     move.w    #32,yoko
  500.     move.w    #32,tate
  501.  
  502.     lea.l    dot_tbl(pc),a0        *画面サイズを求める
  503.     move.w    crt_mode(pc),d0
  504.     add.w    d0,d0
  505.     add.w    d0,d0
  506.     move.l    0(a0,d0.w),a0
  507.  
  508.     move.w    (a0)+,crt_x
  509.     move.w    (a0),crt_y
  510.  
  511.     clr.w    x_pos            *ロード座標を初期化
  512.     clr.w    y_pos
  513.  
  514.     tst.b    lcflg            *LCスイッチ指定
  515.     beq    lc_chk2            *指定なし
  516.  
  517. lc_chk0:
  518.     move.w    crt_x(pc),d0        *X方向のセンタリング
  519.     cmp.w    yoko(pc),d0
  520.     bcs    lc_chk1
  521.  
  522.     sub.w    yoko(pc),d0
  523.     bclr.l    #0,d0
  524.     lsr.w    #1,d0            *d0を1/2
  525.     move.w    d0,x_pos
  526. lc_chk1:
  527.     move.w    crt_y(pc),d0        *Y方向のセンタリング
  528.     cmp.w    tate(pc),d0
  529.     bcs    lc_chk2
  530.  
  531.     sub.w    tate(pc),d0
  532.     bclr.l    #0,d0
  533.     lsr.w    #1,d0            *d0を1/2
  534.     move.w    d0,y_pos
  535. lc_chk2:
  536.     rts
  537.  
  538. *****************************************************************
  539. *    アイコン表示                        *
  540. *****************************************************************
  541. icon_prt:
  542.     lea.l    icon_buff(pc),a1    *ICONバッファ
  543.  
  544.     lea.l    i_pal(a1),a0        *パレットデータの先頭
  545.  
  546.     lea.l    i_data(a1),a1        *ICONデータの先頭
  547.     move.w    yoko(pc),d0
  548.     lsr.w    #1,d0
  549.     move.w    tate(pc),d1
  550.     subq.w    #1,d1
  551.     mulu    d0,d1
  552.     add.w    d1,a1
  553.  
  554.     tst.b    hflg            *背景表示スイッチ
  555.     bne    icon_hai        *あり
  556.  
  557.     tst.b    lcflg            *LCスイッチ指定
  558.     beq    icon_prt0        *指定なし
  559.  
  560.     move.w    x_pos(pc),d0        *ICONデータの表示先
  561.     move.w    y_pos(pc),d1
  562.     move.w    yoko(pc),d2
  563.     lsr.w    #1,d2
  564.     sub.w    d2,d1
  565.  
  566.     swap    d1
  567.     clr.w    d1
  568.     ror.l    #6,d1
  569.     add.w    d0,d0
  570.     add.w    d0,d1
  571.     movea.l    d1,a2
  572.     adda.l    #GRAM,a2
  573.     bra    icon_prt0_
  574.  
  575. icon_prt0:
  576.     movea.l    #GRAM,a2
  577.  
  578. icon_prt0_:
  579.     move.w    yoko(pc),a3        *ICONデータの差分
  580.  
  581.     move.w    #512,d0            *GARMの差分
  582.     sub.w    yoko(pc),d0
  583.     add.w    d0,d0
  584.     movea.w    d0,a4
  585.  
  586.     move.w    #$000f,d6        *マスクデータ
  587.     move.w    #$00f0,d5
  588. icon_prt1:
  589.     move.w    yoko(pc),d0        *横ループ
  590.     move.w    tate(pc),d2        *縦ループ
  591.  
  592.     subq.w    #1,d2            *縦-1
  593.     lsr.w    #1,d0            *横/2-1
  594.     subq.w    #1,d0
  595. icon_prt2:
  596.     move.w    d0,d1            *横ループ
  597. icon_prt3:
  598.     move.b    (a1)+,d3
  599.     move.b    d3,d4
  600.  
  601.     and.w    d5,d4            *上位4ビットを変換
  602.     lsr.b    #3,d4
  603.     move.w    0(a0,d4.w),(a2)+
  604.  
  605.     and.w    d6,d3            *下位4ビットを変換
  606.     add.w    d3,d3
  607.     move.w    0(a0,d3.w),(a2)+
  608.     dbra    d1,icon_prt3
  609.     suba.l    a3,a1
  610.     adda.l    a4,a2
  611.     dbra    d2,icon_prt2
  612.     rts
  613.  
  614.  
  615. icon_hai:
  616.     movea.l    #GRAM,a2
  617.     movea.w    yoko(pc),a3        *ICONデータの差分
  618.  
  619.     move.w    #512,d0            *GARMの差分
  620.     sub.w    yoko(pc),d0
  621.     add.w    d0,d0
  622.     movea.w    d0,a4
  623.  
  624.     move.w    #$000f,d6        *マスクデータ
  625.     move.w    #$00f0,d5
  626.  
  627. icon_hai1:
  628.     move.w    yoko(pc),d0        *横ループ
  629.     lsr.w    #1,d0
  630.     subq.w    #1,d0
  631.     move.w    tate(pc),d2        *縦ループ
  632.     subq.w    #1,d2
  633.  
  634. icon_hai2:
  635.     move.w    d0,d1            *横ループ
  636.  
  637. icon_hai3:
  638.     move.b    (a1)+,d3
  639.     move.b    d3,d4
  640.  
  641.     and.w    d5,d3            *上位4ビットを変換
  642.     lsr.b    #3,d3
  643.     move.w    0(a0,d3.w),d3
  644.  
  645.     and.w    d6,d4            *下位4ビットを変換
  646.     add.w    d4,d4
  647.     move.w    0(a0,d4.w),d4
  648.  
  649.     moveq.l    #16-1,d7
  650. icon_hai4:
  651.     move.w    d3,960(a2)
  652.     move.w    d3,896(a2)
  653.     move.w    d3,832(a2)
  654.     move.w    d3,768(a2)
  655.     move.w    d3,704(a2)
  656.     move.w    d3,640(a2)
  657.     move.w    d3,576(a2)
  658.     move.w    d3,512(a2)
  659.     move.w    d3,448(a2)
  660.     move.w    d3,384(a2)
  661.     move.w    d3,320(a2)
  662.     move.w    d3,256(a2)
  663.     move.w    d3,192(a2)
  664.     move.w    d3,128(a2)
  665.     move.w    d3,64(a2)
  666.     move.w    d3,(a2)+
  667.  
  668.     move.w    d4,960(a2)
  669.     move.w    d4,896(a2)
  670.     move.w    d4,832(a2)
  671.     move.w    d4,768(a2)
  672.     move.w    d4,704(a2)
  673.     move.w    d4,640(a2)
  674.     move.w    d4,576(a2)
  675.     move.w    d4,512(a2)
  676.  
  677.     move.w    d4,448(a2)
  678.     move.w    d4,384(a2)
  679.     move.w    d4,320(a2)
  680.     move.w    d4,256(a2)
  681.     move.w    d4,192(a2)
  682.     move.w    d4,128(a2)
  683.     move.w    d4,64(a2)
  684.     move.w    d4,(a2)+
  685.  
  686.     adda.l    #32*1024-4,a2
  687.     dbra.w    d7,icon_hai4
  688.     suba.l    #16*32*1024-4,a2
  689.  
  690.     dbra    d1,icon_hai3
  691.     suba.l    a3,a1
  692.     adda.l    a4,a2
  693.     dbra    d2,icon_hai2
  694.     rts
  695.  
  696. *****************************************************************
  697. *    ファイルのOPENを行う                *
  698. *****************************************************************
  699. file_open:
  700.     move.w    #0,-(sp)        *ファイルopen
  701.     move.l    a0,-(sp)
  702.     DOS    _OPEN
  703.     addq.l    #6,sp
  704.     tst.l    d0            *OK?
  705.     bmi    open_err
  706.     move.l    d0,d7            *ファイルハンドルセーブ
  707.     rts
  708.  
  709. *****************************************************************
  710. *    ファイルのサイズを求める(d6に返す)            *
  711. *****************************************************************
  712. file_size:
  713.     move.w    #2,-(sp)
  714.     move.l    #0,-(sp)
  715.     move.w    d7,-(sp)
  716.     DOS    _SEEK
  717.     addq.l    #8,sp
  718.     tst.l    d0            *OK?
  719.     bmi    read_err
  720.  
  721.     move.l    d0,d6
  722.  
  723.     move.w    #0,-(sp)
  724.     move.l    #0,-(sp)
  725.     move.w    d7,-(sp)
  726.     DOS    _SEEK
  727.     addq.l    #8,sp
  728.     tst.l    d0            *OK?
  729.     bmi    read_err
  730.     rts
  731.  
  732. *****************************************************************
  733. *    ディスクからデータの読み込みを行う            *
  734. *****************************************************************
  735. file_read:
  736.     move.l    d6,-(sp)        *データサイズ
  737.     move.l    a4,-(sp)        *バッファアドレス
  738.     move.w    d7,-(sp)        *ファイルハンドル
  739.     DOS    _READ
  740.     lea    10(sp),sp        *スタック補正
  741.     tst.l    d0            *OK?
  742.     bmi    read_err
  743.     cmp.l    d6,d0            *全部読めたか
  744.     bne    read_err
  745.     rts
  746.  
  747. *****************************************************************
  748. *    ファイルをCLOSEする                *
  749. *****************************************************************
  750. file_close:
  751.     move.w    d7,-(sp)        *ファイルCLOSE
  752.     DOS    _CLOSE
  753.     addq.l    #2,sp
  754.     rts
  755.  
  756. *****************************************************************
  757. *    キー入力待ち                        *
  758. *****************************************************************
  759. key_wait:
  760.     sf    esc_flg
  761.     sf    next_flg
  762.  
  763.     tst.b    kflg            *キー入力待ち
  764.     beq    key_wait1        *指定無し
  765.  
  766. key_wait0:
  767.     bsr    key_chk            *キー入力チェック
  768.  
  769.     tst.b    esc_flg            *エスケープ入力有るか
  770.     bne    key_wait9        *指定有り
  771.     tst.b    next_flg        *ネクスト入力有るか
  772.     bne    key_wait9        *指定有り
  773.     bra    key_wait0        *キー入力に戻る
  774.  
  775. key_wait1:
  776.     bsr    key_chk            *ESCくらいは入力チェック
  777.  
  778. key_wait9:
  779.     rts
  780.  
  781. *****************************************************************
  782. *    キー入力チェック                    *
  783. *****************************************************************
  784. key_chk:
  785.     movea.l    #$800,a0
  786.     btst.b    #1,(a0)            *ESCが押されたか?
  787.     beq    key_chk_        *押されていない
  788.     st    esc_flg            *ESCスイッチON
  789.     bra    key_chk9
  790.  
  791. key_chk_:
  792.     btst.b    #7,1(a0)        *BSが押されたか?
  793.     beq    key_chk0
  794.     st    esc_flg
  795.     bra    key_chk9
  796.  
  797. key_chk0:
  798.     btst.b    #5,3(a0)        *RETURNが押されたか?
  799.     bne    key_chk7        *押された
  800.  
  801. key_chk1:
  802.     btst.b    #5,6(a0)        *SPACEが押されたか?
  803.     bne    key_chk7
  804.  
  805. key_chk2:
  806.     btst.b    #6,9(a0)        *ENTERが押されたか?
  807.     beq    key_chk8
  808.  
  809. key_chk7:
  810.     tst.b    inkey_flg1
  811.     bne    key_chk9
  812.     st    inkey_flg1
  813.     st    next_flg
  814.     bra    key_chk9
  815.  
  816. key_chk8:
  817.     sf    inkey_flg1
  818.  
  819. key_chk9:
  820.     rts
  821.  
  822. *****************************************************************
  823. *    CRTCの値を設定する                    *
  824. *****************************************************************
  825. crtc_set:
  826.     lea.l    crtc_tbl(pc),a0
  827.     move.w    crt_mode(pc),d0
  828.     add.w    d0,d0
  829.     add.w    d0,d0
  830.     move.l    0(a0,d0.w),a0
  831.  
  832.     tst.w    (a0)+            *HRL=0?
  833.     beq    crtc_set0
  834.     or.b    #%0010,$e8e007        *HRLビットを立てる
  835.     bra    crtc_set1
  836. crtc_set0:
  837.     bclr.b    #1,$e8e007        *HRLビットを消す
  838. crtc_set1:
  839.     movea.l    #$e80000,a1
  840.     move.w    (a0)+,$28(a1)        *crtc r20
  841.  
  842.     move.w    (a0)+,(a1)+        *crtc r00-r08
  843.     move.w    (a0)+,(a1)+
  844.     move.w    (a0)+,(a1)+
  845.     move.w    (a0)+,(a1)+
  846.     move.w    (a0)+,(a1)+
  847.     move.w    (a0)+,(a1)+
  848.     move.w    (a0)+,(a1)+
  849.     move.w    (a0)+,(a1)+
  850.     move.w    (a0),(a1)
  851.     rts
  852.  
  853. *****************************************************************
  854. *    画面の動機待ち                        *
  855. *****************************************************************
  856. v_wait:
  857.     movea.l    #$e88001,a0
  858.     moveq.l    #4,d0
  859. v_wait0:
  860.     btst.b    d0,(a0)
  861.     beq    v_wait0
  862. v_wait1:
  863.     btst.b    d0,(a0)
  864.     bne    v_wait1
  865.     rts
  866.  
  867. *****************************************************************
  868. *    カーソル消す                        *
  869. *****************************************************************
  870. cursol_clr:
  871.     move.b    $992.w,cur_save
  872.     beq    cursol_clr9
  873.     IOCS    _OS_CUROF
  874.  
  875. cursol_clr9:
  876.     rts
  877.  
  878. *****************************************************************
  879. *    カーソル戻す                        *
  880. *****************************************************************
  881. cursol_recv:
  882.     tst.b    cur_save
  883.     beq    cursol_recv9
  884.     IOCS    _OS_CURON
  885.  
  886. cursol_recv9:
  887.     rts
  888.  
  889. *****************************************************************
  890. *    スーパーモードにする                    *
  891. *****************************************************************
  892. super:
  893.     clr.l    -(sp)            *スーパーバイザモードへ移行
  894.     DOS    _SUPER
  895.     addq.l    #4,sp
  896.     move.l    d0,sp_save
  897.     rts
  898.  
  899. *****************************************************************
  900. *    ユーザーモードにする                    *
  901. *****************************************************************
  902. user:
  903.     move.l    sp_save(pc),-(sp)    *ユーザーモードへ
  904.     DOS    _SUPER
  905.     addq.l    #4,sp
  906.     rts
  907.  
  908. *****************************************************************
  909. *    処理したファイル数をチェックする            *
  910. *****************************************************************
  911. file_cnt_chk:
  912.     tst.w    file_cnt        *処理したファイルは0個か
  913.     bne    file_cnt_chk1        *違う
  914.     bsr    no_file            *ファイルが無かった
  915. file_cnt_chk1:
  916.     rts
  917.  
  918. *****************************************************************
  919. *    処理するファイルがなかった                *
  920. *****************************************************************
  921. no_file:
  922.     lea.l    no_file_mes(pc),a0
  923.     bsr    mesput
  924.     rts
  925.  
  926. *****************************************************************
  927. *    ファイル名エラー                    *
  928. *****************************************************************
  929. name_er:
  930.     lea.l    name_er_mes(pc),a0
  931.     bsr    mesput
  932.     bra    exit2
  933.  
  934. *****************************************************************
  935. *    ファイルが見付からない                    *
  936. *****************************************************************
  937. open_err:
  938.     lea.l    arg(pc),a0
  939.     bsr    mesput
  940.     lea.l    open_er_mes(pc),a0
  941.     bsr    mesput
  942.     bra    exit2
  943.  
  944. *****************************************************************
  945. *    読み込みエラー                        *
  946. *****************************************************************
  947. read_err:
  948.     lea.l    arg(pc),a0
  949.     bsr    mesput
  950.     lea.l    read_er_mes(pc),a0
  951.     bsr    mesput
  952.     bra    exit2
  953.  
  954. *****************************************************************
  955. *    ICOファイルじゃない                    *
  956. *****************************************************************
  957. ico_err:
  958.     bsr    file_close
  959.     lea.l    arg(pc),a0
  960.     bsr    mesput
  961.     lea.l    ico_er_mes(pc),a0
  962.     bsr    mesput
  963.     rts
  964.  
  965. *****************************************************************
  966. *    使用方表示                        *
  967. *****************************************************************
  968. usage:
  969.     lea.l    usage_mes(pc),a0
  970.     bsr    mesput
  971.     bra    exit2
  972.  
  973. *****************************************************************
  974. *    メッセージ表示                        *
  975. *****************************************************************
  976. mesput:
  977. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  978.     move.w    #STDOUT,-(sp)        *標準出力へ
  979.     move.l    a0,-(sp)        *メッセージを
  980.     DOS    _FPUTS            *出力する
  981.     addq.l    #6,sp            *スタック補正
  982.     rts
  983.  
  984. *****************************************************************
  985. *    終了処理                        *
  986. *****************************************************************
  987. exit:
  988.     IOCS    _MS_INIT        *キーバッファクリア
  989.     moveq.l    #-1,d1
  990.     IOCS    _SKEY_MOD
  991.     move.w    #-1,-(sp)
  992.     DOS    _KFLUSH
  993.     addq.l    #2,sp
  994.     rts
  995.  
  996. *****************************************************************
  997. *    エラー処理2                        *
  998. *****************************************************************
  999. exit2:
  1000.     bsr    exit
  1001.     move.w    #1,-(sp)        *終了コード1を持って
  1002.     DOS    _EXIT2            * エラー終了
  1003.  
  1004. *****************************************************************
  1005. *    データエリア                        *
  1006. *****************************************************************
  1007.     .data
  1008.     .even
  1009. usage_mes:
  1010.     .dc.b    'ICO Loader V0.02 by A.MUKAWA',CR,LF
  1011.     .dc.b    '機能:ICOファイルを表示します。',CR,LF
  1012.     .dc.b    '用法:LDICO [スイッチ] ファイル名',CR,LF
  1013.     .dc.b    CR,LF
  1014.     .dc.b    '             /K        表示後にキー入力待ち。',CR,LF
  1015.     .dc.b    '             /C        表示前に画面消去。',CR,LF
  1016.     .dc.b    '             /LC       画面中央に表示。',CR,LF
  1017.     .dc.b    '             /H        背景表示モード。',CR,LF
  1018.     .dc.b    0
  1019. no_file_mes:
  1020.     .dc.b    '表示できるファイルがありません!',CR,LF,0
  1021. name_er_mes:
  1022.     .dc.b    'ファイル名の指定に間違いがあります!',CR,LF,0
  1023. open_er_mes:
  1024.     .dc.b    ' が見つかりません!',CR,LF,0
  1025. read_er_mes:
  1026.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  1027. ico_er_mes:
  1028.     .dc.b    ' は表示できません!',CR,LF,0
  1029. crlf_mes:
  1030.     .dc.b    CR,LF,0
  1031. func_off_mes:
  1032.     .dc.b    $1b,$5b,$3e,$31,$68,0
  1033.  
  1034. dext:
  1035.     .dc.b    '.ICO',0        *補う拡張子
  1036. komekome:
  1037.     .dc.b    '\'
  1038. kome0:
  1039.     .dc.b    '*.ICO',0
  1040.  
  1041. kflg:
  1042.     .dcb.b    1,0            */Kスイッチon/offフラグ(=0...off,<>0...on)
  1043. cflg:
  1044.     .dcb.b    1,0            */Cスイッチon/offフラグ(=0...off,<>0...on)
  1045. sflg:
  1046.     .dcb.b    1,0            */Sスイッチon/offフラグ(=0...off,<>0...on)
  1047. lcflg:
  1048.     .dcb.b    1,0            */LCスイッチon/offフラグ(=0...off,<>0...on)
  1049. hflg:
  1050.     .dcb.b    1,0            */Hスイッチon/offフラグ(=0...off,<>0...on)
  1051. int_flg:
  1052.     .dcb.b    1,0            *
  1053. inkey_flg1:
  1054.     .dcb.b    1,1            *
  1055.     .even
  1056.  
  1057. crt_max:
  1058.     .dc.w    3-1
  1059. crtc_tbl:
  1060.     .dc.l    mode0
  1061.     .dc.l    mode1
  1062.     .dc.l    mode2
  1063. crtc_data:
  1064. *        HRL  R20  R00  R01  R02  R03  R04  R05  R06  R07  R08
  1065. mode0:    .dc.w    $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B    *512*512 正方形
  1066. mode1:    .dc.w    $01,$311, $44, $05, $0A, $3A,$237, $05, $28,$228, $1B    *384*256
  1067. mode2:    .dc.w    $00,$310, $37, $04, $08, $30,$1E7, $05, $28,$208, $1B    *320*224 24k
  1068.  
  1069. dot_tbl:
  1070.     .dc.l    dot0
  1071.     .dc.l    dot1
  1072.     .dc.l    dot2
  1073. dot_data:
  1074. dot0:    .dc.w    512,512
  1075. dot1:    .dc.w    384,256
  1076. dot2:    .dc.w    320,224
  1077.  
  1078. *****************************************************************
  1079. *    ワークエリア                        *
  1080. *****************************************************************
  1081.     .bss
  1082.     .even
  1083. filbuf:
  1084.     .ds.b    53            *ファイル情報格納バッファ
  1085. nambuf:
  1086.     .ds.b    92            *ファイル名展開用バッファ
  1087. arg:
  1088.     .ds.b    256            *ファイル名バッファ
  1089.     .even
  1090. file_cnt:
  1091.     .ds.w    1            *ファイル数のカウント用バッファ
  1092. sp_save:
  1093.     .ds.l    1
  1094. yoko:
  1095.     .ds.w    1            *画像の横(X)サイズ
  1096. tate:
  1097.     .ds.w    1            *画像の縦(Y)サイズ
  1098. crt_x:
  1099.     .ds.w    1            *画面のXサイズ
  1100. crt_y:
  1101.     .ds.w    1            *画面のYサイズ
  1102. x_pos:
  1103.     .ds.w    1            *ロード時のX座標
  1104. y_pos:
  1105.     .ds.w    1            *ロード時のY座標
  1106. crt_mode:
  1107.     .ds.w    1            *画面モード
  1108. line_cnt:
  1109.     .ds.w    1
  1110. esc_flg:
  1111.     .ds.b    1            *
  1112. next_flg:
  1113.     .ds.b    1            *
  1114. cur_save:
  1115.     .ds.b    1            *
  1116.     .even
  1117. icon_buff:
  1118.     .ds.b    766            *アイコンバッファ
  1119. my_stack:
  1120.     .ds.l    1024
  1121. mysp:
  1122.     .even
  1123.  
  1124.     .end    start
  1125.